package main.java;

import java.io.IOException;
import java.util.Comparator;

public class StudentInfoSystemTest {
    public static void main(String[] args) {
        // 1. 定义文件路径（可根据实际环境调整）
        String inputPath = "src/main/resources/students.txt";
        String outputPath = "src/main/resources/top_students_names.txt";

        try {
            // 2. 从文件读取学生数据：解析每行字符串为Student对象
            DataContainer<Student> studentContainer = GenericFileHandler.readFromFile(
                    inputPath,
                    line -> {
                        // 解析格式：id,name,age,score（如"202411671214,李蓉曼,20,85.5"）
                        String[] parts = line.split(",");
                        if (parts.length != 4) {
                            throw new IllegalArgumentException("Invalid line format: " + line);
                        }
                        String id = parts[0].trim();
                        String name = parts[1].trim();
                        int age = Integer.parseInt(parts[2].trim());
                        double score = Double.parseDouble(parts[3].trim());
                        return new Student(id, name, age, score);
                    }
            );
            System.out.println("读取到的学生数量：" + studentContainer.size());

            // 3. 按成绩降序排序（使用GenericConverter的自定义排序）
            DataContainer<Student> sortedContainer = GenericConverter.sort(
                    studentContainer,
                    Comparator.comparingDouble(Student::getScore).reversed() // 成绩降序
            );

            // 4. 筛选成绩>80的高分学生（使用DataContainer的filter方法）
            DataContainer<Student> topStudents = sortedContainer.filter(
                    student -> student.getScore() > 80
            );
            System.out.println("高分学生（成绩>80）数量：" + topStudents.size());

            // 5. 转换为姓名容器（使用GenericConverter的convert方法）
            DataContainer<String> topNames = GenericConverter.convert(
                    topStudents,
                    Student::getName // 提取学生姓名
            );

            // 6. 将姓名写入输出文件
            GenericFileHandler.writeToFile(topNames, outputPath);
            System.out.println("高分学生姓名已写入：" + outputPath);

            // 7. 验证输出：读取输出文件并打印
            DataContainer<String> printedNames = GenericFileHandler.readFromFile(
                    outputPath,
                    line -> line.trim() // 直接返回姓名字符串
            );
            System.out.println("输出文件中的姓名：");
            for (int i = 0; i < printedNames.size(); i++) {
                System.out.println((i + 1) + ". " + printedNames.get(i));
            }

        } catch (IOException e) {
            System.err.println("文件IO异常：" + e.getMessage());
            e.printStackTrace();
        } catch (Exception e) {
            System.err.println("处理异常：" + e.getMessage());
            e.printStackTrace();
        }
    }
}